package edu.upc.wib.service.impl;

import edu.upc.wib.dao.impl.UsuarioDaoImpl;
import edu.upc.wib.entity.Usuario;
import edu.upc.wib.service.UsuarioService;
import edu.upc.wib.utilitarios.TorneoException;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
 
/**
 *
 * @author gian
 *
 */
@Service
public class UsuarioServiceImpl implements UsuarioService {

    private static Logger log = LoggerFactory.getLogger(UsuarioDaoImpl.class);
    @Autowired
    private UsuarioDaoImpl usuarioDao;

    @Override
    public Integer crear(Usuario usuario) throws TorneoException {
        log.info("Actualizando usuario");

        String msgError = "";

        if (!(usuario.getCorreo().equals("") || usuario.getNombre().equals("")
                || usuario.getApellidoPaterno().equals("") || usuario.getApellidoMaterno().equals(""))) {

            if (usuario.getClave().equals(usuario.getClaveCnf())) {
                Usuario buscarPorCorreo = usuarioDao.buscarPorCorreo(usuario.getCorreo().trim());

                if (buscarPorCorreo == null) {

                    if (usuario.getClave().length() > 4) {
                        
                        return usuarioDao.crear(usuario);
                        
                    } else {
                        msgError = "El password debe ser mayor de cuatro digitos.";
                    }
                } else {
                    msgError = "La cuenta de correo ya se encuentra registrada.";
                }
            } else {
                msgError = "Password no coincide.";
            }
        } else {
            msgError = "Existen datos obligatorios en blanco.";
        }

        if (!msgError.isEmpty()) {
            log.error(msgError);
            throw new TorneoException(msgError);
        }        

        return null;
    }

    @Override
    public void actualizar(Usuario usuario) throws TorneoException {
        log.info("Actualizando usuario");

        String msgError = "";

        if (!(usuario.getNombre().equals("") || usuario.getApellidoPaterno().equals("") || usuario.getApellidoMaterno().equals(""))) {

            if (validaNumero(usuario.getTelefono1()) && validaNumero(usuario.getTelefono2())) {

                if (validaNumero(usuario.getDocIdentidad())) {

                    if (usuario.getTarjCred().length() == 16) {

                        if (usuario.getTarjCvc().length() == 3) {

                            usuarioDao.actualizar(usuario);

                        } else {
                            msgError = "CVC invalido";
                        }
                    } else {
                        msgError = "Tarjeta invalida";
                    }
                } else {
                    msgError = "Documento de identidad debe ser numerico";
                }
            } else {
                msgError = "Telefonos deben ser numericos";
            }
        } else {
            msgError = "Existen datos obligatorios en blanco.";
        }

        if (!msgError.isEmpty()) {
            log.error(msgError);
            throw new TorneoException(msgError);
        }

    }

    public boolean actualizarClave(Integer id, String clave, String claveConfirm) {
        log.info("Actualizando clave");
        if (clave.equals(claveConfirm)) {
            usuarioDao.actualizarClave(id, clave);
            return true;
        } else {
            log.error("Claves no coinciden.");
        }
        return false;
    }

    @Override
    public void eliminar(Integer id) {
        log.info("Eliminando usuario por su id");
        usuarioDao.eliminar(id);
    }

    @Override
    public Usuario obtener(Integer id) {
        log.info("Buscar usuario por id");
        return usuarioDao.obtener(id);
    }

    @Override
    public List<Usuario> obtenerTodos() {
        log.info("Buscando todos los usuarios");
        return usuarioDao.obtenerTodos();
    }

    @Override
    public List<Usuario> buscarPorApellidoPaterno(String nombre) {
        return usuarioDao.buscarPorApellidoPaterno(nombre);
    }

    @Override
    public Usuario buscarPorCorreo(String correo) {
        return usuarioDao.buscarPorCorreo(correo);
    }

    @Override
    public Boolean autenticar(String correo, String password) {
        if (correo.contains("@")) {
            Usuario user = usuarioDao.buscarPorCorreo(correo.trim());
            if (user != null) {
                return user.getClave().equals(password);
            }
        }
        return Boolean.FALSE;
    }

    public boolean validaNumero(String texto) {

        if (texto != null) {
            if (texto.matches("^[1-9]\\d*$")) {
                return true;
            }
        }
        return false;
    }
}
